網站跟資料庫簽立契約的開始。很怕還沒締結契約好,他們就先分手了…,希望我是他們最好的媒人公。

進入主題前的小知識

Laravel 內建四種資料庫連線方式

  • SQLite(sqlite)
  • MySQL(mysql) Laravel 連線預設
  • PostgreSQL(pgsql)
  • SQL Server(sqlsrv)

Laravel 透過資料庫存取方式

  • Query Builder 查詢產生器
  • Eloquent ORM 關聯式資料庫映射

資料填充的方式

  • Seeder
  • Factory

建立資料庫連線

在建立 Laravel 專案中,Laravel已經將資料庫連線方式已經寫好等我們了,只要我們自己設定一下就可以完成連線程序。大多使用 Laravel 的開發者,都是以MySQL做為搭配的資料庫,那Laravel 剛好就預設MySQL連線方式。

專案 > config > database.php(資料庫連線設定檔)

設定專案環境設定檔

本機與正式機器的時候,環境有所不同,有些資料庫會另外給一台主機,有些則是跟程式同一台主機,但都需修改以下資料。

※ Laravel 在執行啟動時,會一併將.env環境設定檔做載入。

  • 主機名稱(host)
  • 連接埠號(port)
  • 資料庫名稱(database)
  • 資料庫帳號(username)
  • 資料庫密碼(password)

專案 > .env

1
2
3
4
5
6
DB_CONNECTION=mysql #資料庫類型
DB_HOST=127.0.0.1 #主機位子
DB_PORT=3306 #資料庫連接埠號,一般都是3306
DB_DATABASE=test #資料庫名稱
DB_USERNAME=root #資料庫帳號
DB_PASSWORD=bPPVnyRbh7YBeONl #資料庫密碼

測試資料庫是否有連線成功

讀取資料表做為測試,取得 member資料表 第一筆資料。

1
2
3
Route::get('/', function () {
print_r( DB::table('member')->first() );
});

執行結果 出現第一筆資料結果,代表資料庫連線成功

資料庫遷移(migration)

migration是掌握資料庫結構的檔案,透過程式碼定義資料庫欄位、型態,就很像是我們一般在匯出資料庫的時候所看到的原始碼一樣。在專案程式要共同撰寫的時候,透過Git一起開發,大家都會拿到一樣的 migration 描述檔,

建立資料庫遷移(migration)

  • 資料表使用英文複數(s、es)
  • 資料表用字母小寫,單字間用蛇底式命名(Snake Case)

使用 artisan 指令建立migration

1
2
3
4
$ php artisan make:migration create_members_table

<!-- 建立 migration 的語法 -->
$ php artisan make:migration create_資料表名稱s_table

:::info
建立migration和model兩個步驟同時新增,可以直接在後面加上-m (代表新增 migration)
※ 命名規則:單字字首大寫,不加上複數。

結果:
model名稱 -> Member.php,
migration名稱 -> 2020_05_22_105756_create_members_table.php

1
2
3
4
$ php artisan make:model Member -m

<!-- 建立 migration 和 model 的語法 -->
$ php artisan make:model Model名稱 -m

:::

執行以上指令檔案建立在 專案 > database > migrations, 打開 2020_05_22_105756_create_members_table.php
※ 檔名的組成:<建立日期時間> _ create_ <資料表名稱>_table,

每個建立好的 migration 會有兩個 function 分別是 up 和 down。

程式碼如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMembersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('members', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('members');
}
}

終端機輸入以下指令:

1
$ php artisan migrate

會執行 public function up() 方法來新增資料表。

1
$ php artisan migrate:rollback

會執行 public function down()方法來刪除資料表。

有關資料表的操作可詳見 結構生成器 (Schema)

資料表欄位設計

Laravel migrat常用型態介紹

詳細型態轉換,參考官方文件資料庫遷移

數值

欄位設定 對應資料庫屬性 備註
$table->increments(‘id’); int AUTO_INCREMENT
$table->integer(‘votes’); int
$table->double(‘column’, 15, 8); double
$table->float(‘amount’); float
$table->boolean(‘confirmed’); boolean
$table->decimal(‘amount’, 5, 2); decimal

時間

欄位設定 對應資料庫屬性 備註
$table->date(‘created_at’); date
$table->dateTime(‘created_at’); dateTime
$table->time(‘sunrise’); time
$table->timestamp(‘added_on’); timestamp
$table->timestamps(); timestamps 加入 created_atupdated_at

字串

欄位設定 對應資料庫屬性 備註
$table->char(‘name’, 4); char
$table->string(‘email’); varchar
$table->string(‘name’, 100); varchar
$table->text(‘description’); text
$table->enum(‘choices’, array(‘foo’, ‘bar’)); enum
$table->json(‘options’); JSON

預設

通用

語法 預設內容 備註
->nullable() NULL
->default($value) $value 宣告欄位的預設值
->unique() 唯一值
$table->unique([‘m_account’],’member_account_uk’); 唯一值 與前一個方法相同
->primary() 主鍵值
$table->primary([‘id’],’member_pk’); 主鍵值 與前一個方法相同
->index() 索引
$table->index([‘m_email’],’m_email_index’); 索引 與前一個方法相同

數值

語法 預設內容 備註
->unsigned() 0(含)以上 設定整數是無分正負
->default($value) $value 宣告欄位的預設值

日期

語法 預設內容 備註
-> default(DB::raw(‘CURRENT_TIMESTAMP’)) 現在時間 取得目前的系統日期或時間

將所需要欄位轉化為Laravel 寫法

我們要設計一個屬於會員的資料

英文名稱 中文名稱 資料庫型態 鍵值
id 編號 int Primary Key
m_account 會員帳號 varchar(50)
m_password 會員密碼 varchar(32)
m_name 會員姓名 varchar(50)
m_id 會員編號 varchar(50)
m_email 會員信箱 varchar(50)
m_phone 會員電話 varchar(50)
m_login_time 會員登入時間 datetime
create_at 建立時間 datetime
update_at 更新時間 datetime

※ Primary key (主鍵) 設定資料表格不可重覆、空白或為Null的主鍵值
※ Foreign key (外來鍵) 設定該欄位值的存在必須關連並參照指定資料表格的欄位值
※ Index (索引鍵) 資料索引,可加快搜尋速度
※ Unique (不重複鍵、唯一值) 設定一個或多個欄位組合,資料內容需唯一不可重覆

專案 > database > migrations > 2020_05_22_105756_create_members_table.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateMembersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
// 更新資料庫異動
public function up()
{

// 建立資料表
Schema::create('members', function (Blueprint $table) {
// 設定儲存引擎類型。 預設:InnoDB
$table->engine = 'MyISAM';
// 編號
$table->Increments('id');
// 會員帳號
$table->string('m_account',50)->unique();
// 會員密碼
$table->string('m_password',32);
// 會員姓名
$table->string('m_name',50);
// 會員編號
$table->string('m_id',50);
// 會員信箱
$table->string('m_email',50);
// 會員電話
$table->string('m_phone',50);
// 會員登入時間
$table->timestamp('m_login_time')->nullable();
// 建立時間、更新時間
$table->timestamps();

// 索引值
// $table->unique(['m_account'],'member_account_uk');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
// 還原資料庫異動
public function down()
{
// 刪除資料庫
Schema::dropIfExists('members');
}
}

簡單介紹建立及更新時間的欄位語法,在Laravel中,其實內建好create_atupdated_at這兩個欄位,他也相較於$table->timestamp('create_at')$table->timestamp('updated_at')的寫法。

1
2
3
4
5
6
7
// 建立時間、更新時間
$table->timestamps();

OR

$table->timestamp('create_at');
$table->timestamp('updated_at');

使用 artisan 指令執行 migration 的檔案,建立資料表。

1
$ php artisan migrate

執行上面指令,資料庫增加以下資料表。 migrations 資料表主要是紀錄執行migrate動作的資料表。

使用 artisan 指令執行恢復上一次異動的 migration 檔案。

1
$ php artisan migrate:rollback

使用 artisan 指令執行移除migration檔案。

1
$ php artisan migrate:reset

使用 artisan 指令執行重新建立 migration 的檔案,重新建立資料表

1
$ php artisan migrate:refresh

使用 artisan 指令執行刪掉所有資料庫的資料表(含migrations),並再執行一次migrate

1
$ php artisan migrate:fresh

結論

離在做CRUD的路愈來愈近了,希望可以愈來愈上手,這章在建立資料表的時候,其實沒有那麼順利,要認識很多語法及設定,或許有段時間沒接觸框架這東西吧,在學的時候很怕寫出來的文章會誤人子弟,雖然已經誤人子弟了,哈哈,但總而言之,至少是前進一大步了。

標籤: w3HexSchool PHP Laravel